//
// Cross-platform MCP Client for Windows and Linux
// Created by kenny on 25-10-31.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "example/device_info_example.h"
#include "mcp_json.h"
#include "platform/comm_timer.h"

// 平台特定的头文件
#ifdef _WIN32
    #include <winsock2.h>
    #include <windows.h>
#else
    #include <unistd.h>
    #include <sys/time.h>
#endif

// MCP 相关头文件
#include "mcp_decode.h"
#include "mcp_logger.h"
#include "mcp_service.h"

// 配置参数
#define SERVER_IP "192.168.0.129"
#define SERVER_PORT 18362
#define BUFFER_SIZE 2048

/**
 * 用户在这里生成设备信息
 * @return
 */
const char* my_on_get_device_info() {
    // 组装JSON数据
    JSONObject jsonObject = json_create_object();
    json_object_add_member(&jsonObject, "battery_info", json_create_number(16));
    json_object_add_member(&jsonObject, "temperature", json_create_number(25.2));
    json_object_add_member(&jsonObject, "police_number", json_create_string("000000"));
    json_object_add_member(&jsonObject, "storage", json_create_string("43998208"));
    json_object_add_member(&jsonObject, "used_memory", json_create_string("957568"));
    json_object_add_member(&jsonObject, "remain_memory", json_create_string("43040640"));
    json_object_add_member(&jsonObject, "record_status", json_create_string("0"));
    json_object_add_member(&jsonObject, "stream_encryption", json_create_string(""));
    json_object_add_member(&jsonObject, "product_model", json_create_string("Z6FF"));
    json_object_add_member(&jsonObject, "network_type", json_create_string("4G"));
    json_object_add_member(&jsonObject, "wifi", json_create_string(""));
    json_object_add_member(&jsonObject, "signal_strength", json_create_string("1"));
    json_object_add_member(&jsonObject, "imei", json_create_string("869251060517686"));
    json_object_add_member(&jsonObject, "wifi", json_create_string(""));
    json_object_add_member(&jsonObject, "firmware_version", json_create_string("Z6SFFA.BFTD2.BFTD.HB.FWJ.VQPGVEYWNGSM.20231226.V3."));
    json_object_add_member(&jsonObject, "app_version", json_create_string("1.5.38"));
    char * json_str =  json_stringify(&jsonObject);
    json_free(&jsonObject);
    // json_str 下层方法会释放此变量内存
    return json_str;
}
/**
 * 用户在这里生成设备定位信息
 * @return
 */
const char* my_on_get_position() {
    // 组装JSON数据
    JSONObject jsonObject = json_create_object();
    json_object_add_member(&jsonObject, "time", json_create_string("2025-11-05T18:59:10"));
    json_object_add_member(&jsonObject, "longitude", json_create_number(117.13721447190714));
    json_object_add_member(&jsonObject, "latitude", json_create_number(39.21795838060567));
    json_object_add_member(&jsonObject, "speed", json_create_number(0));
    json_object_add_member(&jsonObject, "direction", json_create_number(0));
    json_object_add_member(&jsonObject, "altitude", json_create_number(0));
    char * json_str =  json_stringify(&jsonObject);
    json_free(&jsonObject);

    // json_str 下层方法会释放此变量内存
    return json_str;
}

void my_on_register_success(const char* message) {
    LOG_INFO("== Registered successfully: %s", message);
}
void my_on_register_fail(const char* message) {
    LOG_INFO("== Registered failed: %s", message);
}
void my_on_unregister(const char* message) {
    LOG_INFO("== Unregistered: %s", message);
}
void my_on_server_time(const char* message) {
    LOG_INFO("== On server time: %s", message);
}

int my_alarm() {
    // 组装JSON数据
    JSONObject jsonObject = json_create_object();
    json_object_add_member(&jsonObject, "alarm_time", json_create_string("2025-11-05T18:59:10"));
    json_object_add_member(&jsonObject, "alarm_priority", json_create_number(1));
    json_object_add_member(&jsonObject, "alarm_method", json_create_string("SOS"));
    char * json_str =  json_stringify(&jsonObject);
    // 发送
    int ret = mcp_alarm(json_str);
    json_free(&jsonObject);
    free(json_str);
    return ret;
}

/**
 * 平台初始化函数
 */
void platform_init() {
#ifdef _WIN32
    // Windows 网络初始化
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        LOG_ERROR("WSAStartup failed");
        exit(1);
    }
    printf("Windows platform initialized\n");
#else
    printf("Linux platform initialized\n");
#endif
}

/**
 * 平台清理函数
 */
void platform_cleanup() {
#ifdef _WIN32
    WSACleanup();
    printf("Windows platform cleaned up\n");
#else
    printf("Linux platform cleaned up\n");
#endif
}

/**
 * 主函数
 */
// int main(int argc, char* argv[]) {
int main() {
    printf("MCP Client Starting...\n");

    // 平台初始化
    platform_init();

    // MCP 服务初始化
    int ret = mcp_init(SERVER_IP, SERVER_PORT, "300465", 30, 1);
    if (ret != 0) {
        LOG_ERROR("== Failed to initialize MCP service");
        platform_cleanup();
        return -1;
    }
    // 设置注册成功回调
    set_on_register_success(my_on_register_success);
    set_on_register_failure(my_on_register_fail);
    set_on_unregister(my_on_unregister);
    set_on_get_device_info(my_on_get_device_info);
    set_on_get_position(my_on_get_position);
    set_on_server_time(my_on_server_time);

    mcp_start();

    printf("== MCP Client Running...\n");

    LOG_INFO("#### 开始测试通用定时器...");
    mcp_cross_sleep(5);

    // 取服务器时间
    mcp_request_time();

    // 取服务器时间
    mcp_cross_sleep(5);
    my_alarm();

    mcp_cross_sleep(100);

    // 注销
    // mcp_unregister();

    printf("Press any key to exit...\n");
    getchar();
    // 清理资源
    printf("MCP Client Shutting down...\n");
    platform_cleanup();

    return 0;
}
